package model

import "github.com/jinzhu/gorm"

// Itinerary 旅游行程
type Itinerary struct {
	*Model
	Title    string `json:"title"`
	Slogan   string `json:"slogan"`
	CoverUrl string `json:"cover_url"`

	StartDate int `json:"start_date"` // 开始日期，格式为：YYYYMMDD
	EndDate   int `json:"end_date"`   // 结束日期

	ScheduleDetail string `json:"schedule_detail"` // 具体行程安排
	HotelDetail    string `json:"hotel_detail"`    // 住宿信息

	TypeId int `json:"type_id"` // 旅游类型
	UserId int `json:"user_id"`
}

type ItineraryDetail struct {
	ID         int `json:"id"`
	CreatedOn  int `json:"created_on"`
	ModifiedOn int `json:"modified_on"`

	Title    string `json:"title"`
	Slogan   string `json:"slogan"`
	CoverUrl string `json:"cover_url"`

	StartDate int `json:"start_date"`
	EndDate   int `json:"end_date"`

	ScheduleDetail string `json:"schedule_detail"`
	HotelDetail    string `json:"hotel_detail"`

	ScheduleList     []*TourismSchedule `json:"schedule_list"` // 行程列表
	HotelInformation *HotelInformation  `json:"hotel"`         // 酒店信息

	TypeId int `json:"type_id"`
}

// Location 地点信息
type Location struct {
	Name        string  `json:"name"`
	Longitude   float64 `json:"longitude"` // 经度
	Latitude    float64 `json:"latitude"`  // 纬度
	Address     string  `json:"address"`
	Description string  `json:"description"`
}

// TourismSchedule 行程安排
type TourismSchedule struct {
	Date         int         `json:"date"`
	Projects     []int       `json:"projects"`     // 旅游项目
	Introduction string      `json:"introduction"` // 旅游攻略
	Routes       []*Location `json:"routes"`       // 路线
}

// HotelInformation 酒店信息
type HotelInformation struct {
	Location *Location `json:"location"`
	Price    int       `json:"price"` // 价位
}

// ItineraryPart 行程基本信息
type ItineraryPart struct {
	ID        int    `json:"id"`
	CreatedOn int    `json:"created_on"`
	Title     string `json:"title"`
	Slogan    string `json:"slogan"`
	CoverUrl  string `json:"cover_url"`
}

func (i Itinerary) TableName() string {
	return "itinerary"
}

func (i Itinerary) All(db *gorm.DB, pageOffset, pageSize int) ([]*ItineraryPart, error) {
	var itineraries []*ItineraryPart
	var err error

	if pageSize > 0 && pageOffset >= 0 {
		db = db.Offset(pageOffset).Limit(pageSize)
	}

	err = db.Table("itinerary").Where("is_del = ? AND user_id = ?", 0, i.UserId).
		Select("id, created_on, title, slogan, cover_url").Scan(&itineraries).Error

	return itineraries, err
}

func (i Itinerary) Create(db *gorm.DB) error {
	return db.Create(&i).Error
}

func (i Itinerary) GetDetail(db *gorm.DB) (*ItineraryDetail, error) {
	itinerary := &ItineraryDetail{}

	err := db.Table("itinerary").
		Where("is_del = ? AND id = ?", 0, i.ID).
		Select("id, created_on, modified_on, title, slogan, cover_url, type_id, " +
			"start_date, end_date, schedule_detail, hotel_detail").
		First(&itinerary).Error

	if err != nil {
		panic(err.Error())
	}

	return itinerary, err
}
